package org.jgs1904.listener;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

import org.jgs1904.entity.User;

/**
 * 	防止一个账号多端登录
 * @author junki
 * @date 2020年3月28日
 */
@WebListener
public class LoginListener implements HttpSessionAttributeListener {
	
	// 静态的map集合，key是用户名，value是session
	// 实现数据共享，不同listener实例可以获取到所有session对象。
	private static Map<String, HttpSession> sessionMap = new HashMap<>();

    public void attributeAdded(HttpSessionBindingEvent event)  { 
        // 每个用户实现登陆时，都会创建一个自己的onlineUser属性
    	if ("onlineUser".equals(event.getName())) {
			User onlineUser = (User)event.getValue();
			// 判断该用户是否已经在线
			if (sessionMap.containsKey(onlineUser.getUsername())) {
				// 让之前用户的session失效
				sessionMap.get(onlineUser.getUsername()).invalidate();
			}
			// 将本次登录的session存放到map中
			sessionMap.put(onlineUser.getUsername(), event.getSession());
		}
    }

    public void attributeRemoved(HttpSessionBindingEvent event)  { 
    	if ("onlineUser".equals(event.getName())) {
			User onlineUser = (User)event.getValue();
			sessionMap.remove(onlineUser.getUsername());
		}
    }

    public void attributeReplaced(HttpSessionBindingEvent event)  { 
        
    }
	
}
